from typing import List
from common.enum.strategy_group_enum import StrategyGroup
from common.enum.strategy_type_enum import StrategyType
from dto.strategy_info import StrategyInfoMetadata
from dto.strategy_assessment import RiskAssessment
from dto.strategy_info import StrategyInfoMetadata
from dto.strategy_stock_day import StrategyStockDay
from service.strategy.base_strategy import BaseStrategy


class SixDaysDownFollowedByUpStrategy(BaseStrategy):
    """
    关注策略：判断某个股票在过去6天的交易中，如果前3天连续下跌，
    而最近的交易日是连续上涨，连续上涨的天数越多，得分越高。
    """

    def analyze(self, trade_info_list: List[StrategyStockDay]) -> RiskAssessment:
        """
        分析过去6天的数据，若前3天下跌，且后续的交易日是连续上涨。
        每连续上涨一天得3分，连续上涨的天数越多得分越高。
        """
        node_point = 0
        description = ""

        # 确保至少有6天的交易数据
        if len(trade_info_list) >= 6:
            # 获取过去6天的数据
            last_6_days = trade_info_list[-6:]

            # 检查前3天是否连续下跌
            is_downtrend = all(day.close < day.open for day in last_6_days[:3])

            # 如果前3天是下跌，分析后面连续上涨的天数
            if is_downtrend:
                up_days_count = 0
                for i in range(3, 6):
                    if last_6_days[i].close > last_6_days[i].open:
                        up_days_count += 1
                        node_point += 3  # 每天上涨得分 +3
                    else:
                        break  # 遇到非上涨日，停止连续上涨计数

                if up_days_count > 0:
                    description += f"股票在下跌3天后连续上涨{up_days_count}天. "

        return RiskAssessment(
            stock_code=trade_info_list[0].stock_code,
            description=description,
            config=self.strategyConfig(),
            node_point=node_point,
        )

    def strategyConfig(self) -> StrategyInfoMetadata:
        """
        返回策略的配置
        """
        return StrategyInfoMetadata(
            strategy_code="six_days_down_followed_by_up",
            strategy_name="前3天下跌，后续连续上涨策略",
            strategy_group=StrategyGroup.ATTENTION,  # 关注型策略
            strategy_type=StrategyType.PRICE,  # 根据价格类型
            analysis_day=6,
            strategy_level=2,
        )
